Next Permutation(31-Medium)
Description
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place and use only constant extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
Example
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
Solution Code
如果一个数组中的元素从左到右成递减次序,那么就没有一个比它更大的排列,eg.5,4,3,1
。
首先从数组的右边起,找到a[i]使其右边的部分不再递减。
public class NextPermutation {
public void nextPermutation(int[] nums) {
int i = nums.length - 2;
while(i >= 0 && nums[i] >= nums[i+1]) {
i--;
}
if(i >= 0) {
int j = nums.length - 1;
while(j >= 0 && nums[j] <= nums[i]) {
j--;
}
swap(nums, i, j);
}
reverse(nums, i + 1);
}
public void reverse(int[] nums, int i) {
int j = nums.length - 1;
while(i < j) {
swap(nums, i, j);
i++;
j--;
}
}
public void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
Time Complexity: O(n)
Space Complexity: O(1)